/**
 * 神州信息(2012)
 */
package net.abbp.report.model;

import net.abbp.core.compare.IComparable;
import net.abbp.report.model.cell.style.Style;
import net.abbp.report.view.cell.editor.CellEditorManager;
import net.abbp.report.view.cell.editor.ICellEditor;

import com.reportgear.core.api.BaseObject;

/**
 * 单元格对象
 * 
 * @version 1.0
 * @author <a herf="lexloo@gmail.com">lexloo</a>
 * @since ABBP 1.0
 * 
 *        <pre>
 * 历史：
 *      建立: 2012-7-20 lexloo
 * </pre>
 */
public class Cell extends BaseObject implements IComparable<Cell> {
    // 列
    private int column = -1;
    // 行
    private int row = -1;
    // 列跨度
    private int columnSpan = 1;
    // 行跨度
    private int rowSpan = 1;
    // 单元格包含的对象值
    private Object value;
    // 单元格样式
    private Style style;

    // 空单元格,不要对它进行任何修改
    public static final Cell EMPTY_CELL = new Cell(-1, -1);
    // 单元格编辑器管理器
    private static CellEditorManager cellEditorMgr = CellEditorManager.INSTANCE;

    public Cell() {
    }

    public Cell(int column, int row) {
        this.column = column;
        this.row = row;
    }

    /**
     * 
     * @param column 列
     */
    void setColumn(int column) {
        this.column = column;
    }

    /**
     * 
     * @return 列
     */
    public int getColumn() {
        return column;
    }

    /**
     * 
     * @param row 行
     */
    void setRow(int row) {
        this.row = row;
    }

    /**
     * 
     * @return 行
     */
    public int getRow() {
        return row;
    }

    /**
     * 
     * @param columnSpan 列跨度
     */
    public void setColumnSpan(int columnSpan) {
        this.columnSpan = columnSpan;
    }

    /**
     * 
     * @return 列跨度
     */
    public int getColumnSpan() {
        return columnSpan;
    }

    /**
     * 
     * @param rowSpan 行跨度
     */
    public void setRowSpan(int rowSpan) {
        this.rowSpan = rowSpan;
    }

    /**
     * 
     * @return 行跨度
     */
    public int getRowSpan() {
        return rowSpan;
    }

    /**
     * 获取值
     * 
     * @return 值
     */
    public Object getValue() {
        return this.value;
    }

    /**
     * 设置值
     * 
     * @param value
     *            值
     */
    public void setValue(Object value) {
        this.value = value;
    }

    /**
     * 设置样式
     * 
     * @param style 样式
     */
    public void setStyle(Style style) {
        this.style = style;
    }

    /**
     * 获取样式
     * 
     * @return 样式
     */
    public Style getStyle() {
        return this.style == null ? Style.DEFAULT_STYLE : this.style;
    }

    /**
     * 清除对象
     */
    public void clear() {
        this.value = null;
    }

    /**
     * 单元格是否合并的单元格
     * 
     * @return 是否合并的单元格
     */
    public boolean isMerged() {
        return (this.columnSpan > 1) || (this.rowSpan > 1);
    }

    /**
     * 判断是否在单元格中,如果不是合并单元格，则返回false
     * 
     * @param column 列
     * @param row 行
     * @return 在单元格中为true，否则为false
     */
    public boolean isInCell(int column, int row) {
        if ((this.columnSpan == 1) && (this.rowSpan == 1)) {
            return false;
        }

        return (column >= this.column) && (row >= this.row) && (column < this.column + this.columnSpan)
                && (row < this.row + this.rowSpan);
    }

    @Override
    public int compareTo(Cell cell) {
        if (this.row == cell.row) {
            return this.column - cell.column;
        } else {
            return this.row - cell.row;
        }
    }

    /**
     * 获取单元格编辑器
     * 
     * @return 单元格编辑器
     */
    public ICellEditor getCellEditor() {
        return cellEditorMgr.getCellEditor(this.getValue());
    }

    @Override
    public Cell clone() {
        Cell c = (Cell) super.clone();

        if(this.value instanceof BaseObject) {
            c.setValue(((BaseObject)this.value).clone());
        }
        
        //样式没有克隆
        return c;
    }

    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();

        sb.append("Column:").append(column);
        sb.append(",Row:").append(row);
        sb.append(",ColumnSpan:").append(columnSpan);
        sb.append(",RowSpan:").append(rowSpan);
        sb.append(",Value:").append(value);

        return sb.toString();
    }
}
